"""
带有外部状态的生成器函数

问题：
    你想定义一个生成器函数，但是它会调用某个你想暴露给用户使用的外部状态值。
解决方案：
    如果你想让你的生成器暴露外部状态给用户， 别忘了你可以简单的将它实现为一个类，然后把生成器函数放到 __iter__() 方法中过去。

"""

from collections import deque


class LineHistory:
    def __init__(self, lines, histlen=3):
        self.lines = lines
        self.history = deque(histlen)

    def __iter__(self):
        for line_no, line in enumerate(self.lines, 1):
            self.history.append(line_no, line)
            yield line

    def clear(self):
        self.history.clear()


def use_line_history():
    with open('file.txt') as f:
        lines = LineHistory(f)
        for line in lines:
            if "python" in line:
                for line_no, h_line in lines.history:
                    print('{}:{}'.format(line_no, h_line), end='')


if __name__ == '__main__':
    use_line_history()
